typedef int token_t;
extern int errFlag;

/** object types **/
#ifndef VARTYPE
  #define VARTYPE 1
#endif
#ifndef FUNCTYPE
  #define FUNCTYPE 2
#endif
#ifndef PROCTYPE
  #define PROCTYPE 3
#endif
#ifndef PARMTYPE
  #define PARMTYPE 4
#endif
#ifndef LBLTYPE
  #define LBLTYPE 5
#endif
#ifndef CNSTTYPE
  #define CNSTTYPE 6
#endif
#ifndef TYPTYPE
  #define TYPTYPE 7
#endif

/** type conversion **/
#ifndef INTCONV
  #define INTCONV 1
#endif
#ifndef FLOATCONV
  #define FLOATCONV 2
#endif
#ifndef BOOLCONV
  #define BOOLCONV 3
#endif

/** error flags **/
extern int errFlag;
#ifndef LEXERERR
  #define LEXERERR 1
#endif
#ifndef PARSERERR
  #define PARSERERR 2
#endif
#ifndef SEMANTICERR
  #define SEMANTICERR 3
#endif
#ifndef PROGRAMERR
  #define PROGRAMERR 4
#endif

/** max function **/
#ifndef max
  #define max(a,b) ( (a > b) ? (a) : (b) )
#endif

/** parser-pseudocode interface **/
int relop;
int addop;
int mulop;
int acctype;

#define MAXASMSIZE 0x1000000
#define MAXLEN 32
extern char rodataasm[MAXASMSIZE];
extern char bssasm[MAXASMSIZE];
extern char textasm[MAXASMSIZE];
extern char stmtasm[MAXASMSIZE];
extern char exprasm[MAXASMSIZE];
extern char parmasm[MAXASMSIZE];
extern char funcasm[MAXASMSIZE];
extern char genasm[MAXASMSIZE];

/** parser-lexer interface **/
token_t lookahead;
extern void match(token_t);
/** parser modules **/
void program(void);
void block(void);
void declarations(void);
void constant(void);
void modules(void);
void procedure(void);
void function(void);
void formalparm(void);
void parlist(void);
void pardecl(void);
void heading(void);
void procedureheader(void);
void functionheader(void);
void idlist(void);
void type(void);
void stmtblock(void);
void stmtlist(void);
void ifstmt(void);
void whilestmt(void);
void repstmt(void);
void forstmt(void);
void gotostmt(void);
void clause(void);
void casestmt(void);
void constlist(void);
void labelstmt(void);
void idstmt(void);
void readstmt(void);
void readlnstmt(void);
void writestmt(void);
void writelnstmt(void);
void expression(void);
void expr(void);
void term(void);
void factor(void);
void exprlist(void);
